package com.founder.cebxkit;

import java.util.ArrayList;
import java.util.Vector;

public class CEBXDocWrapper {
	private long mXEKDoc;
	private long mXEKStructureDoc;
	private CEBXStructureDocWrapper mStructureDocWrapper;
	private ArrayList<CxSearchResult> arraySearchResults;
	private Vector<CEBXPageWrapper> mPageVector;
	private int nFindRetcode;

	// 字符集类型                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
	public static final int XEK_CHARSET_ANSI		= 0;
	public static final int XEK_CHARSET_SHITJIS		= 128;	// SHIFTJIS_CHARSET, 日文
	public static final int XEK_CHARSET_JOHAB		= 130;	// JOHAB_CHARSET, 韩文
	public static final int XEK_CHARSET_GB			= 134;
	public static final int XEK_CHARSET_BIG5		= 136;
	
	// 用于GetPageBox的pageBoxType参数
	public static final int XEK_PAGEBOX_PHYSICALBOX 	= 0;
	public static final int XEK_PAGEBOX_APPLICATIONBOX 	= 1;
	public static final int XEK_PAGEBOX_CONTENTBOX 		= 2;
	public static final int XEK_PAGEBOX_BLEEDBOX 		= 3;
	
	// 用于RenderPage的smoothTag参数
	public static final int DK_SMOOTH_NONE 	= 0;
	public static final int DK_SMOOTH_IMAGE = 2;
	public static final int DK_SMOOTH_GRAPH = 4;
	public static final int DK_SMOOTH_TEXT 	= 8;
	
	// 查找结果
	public static final int XEK_FIND_SUCCESS = 1;				// 查找成功
	public static final int XEK_FIND_NOMATCHWORD = 2;			// 没有找到
	public static final int XEK_FIND_USERSTOP = 3;				// 用户结束
	public static final int XEK_FIND_ERROR = 4;					// 查找出错
	
	/**
	 * 构造函数，负责各种初始值。
	 * @return
	 */
	public CEBXDocWrapper(long dochandle, long structuredochandle) {
		mXEKDoc = dochandle;
		mXEKStructureDoc = structuredochandle;
		mStructureDocWrapper = null;
		arraySearchResults = new ArrayList<CxSearchResult>();
		mPageVector = new Vector<CEBXPageWrapper>();
		mPageVector.setSize(GetPageCount());
		nFindRetcode = XEK_FIND_ERROR;
	}

	/**
	 * 获取页对象。
	 * @param pagenum	页码，从1开始。
	 * @return
	 */
	public CEBXPageWrapper GetPage(int pagenum){
		CEBXPageWrapper page = mPageVector.get(pagenum - 1);
		if (page == null) {
			page = new CEBXPageWrapper();
			mPageVector.set(pagenum - 1, page);
		}
		page.SetXEKPage(GetXEKPage(pagenum));
		return page;
	}
	
	/**
	 * 释放页对象。
	 * @param pagenum	页码，从1开始。
	 * @return
	 */
	public void ReleasePage(int pagenum){
		ReleaseXEKPage(pagenum);
	}
	
	/**
	 * 获取XEK层页对象。
	 * @param pagenum	页码，从1开始。
	 * @return
	 */
	private native long GetXEKPage(int pagenum);
	
	/**
	 * 释放XEK层页对象。
	 * @param pagenum	页码，从1开始。
	 * @return
	 */
	private native void ReleaseXEKPage(int pagenum);
	
	/**
	 * 设置XEK层版式文档句柄。
	 * @param handle 	文档句柄
	 * @return
	 */
	public void SetXEKDoc(long handle) {
		mXEKDoc = handle;
	}
	
	/**
	 * 设置XEK层流式文档句柄。
	 * @param handle 	文档句柄
	 * @return
	 */
	public void SetXEKStructureDoc(long handle) {
		mXEKStructureDoc = handle;
	}
	
	/**
	 * 获取XEK层版式文档句柄。
	 * @return
	 */
	public long GetXEKDoc() {
		return mXEKDoc;
	}
	
	/**
	 * 设置显示使用的默认字体名字，对于不存在的字体，绘制时将使用该默认字体。
	 * @param defaultFontFaceName	字体名字。
	 * @param charset				字体编码。
	 * @return
	 */
	public native boolean SetDefaultFontFaceName(String defaultFontFaceName, int charset);
	
	/**
	 * 获取文档坐标单位，返回值是1文档单位所代表的毫米数。
	 * @return
	 */
	public native float GetDocUnit();

	/**
	 * 取得文档信息。
	 * @param docInfo	文档信息。
	 * @return
	 */
	public native void GetDocInfo(CxDocInfo docInfo);
	
	/**
	 * 获取流式文档对象。
	 * @return
	 */
	public CEBXStructureDocWrapper GetStructureDoc() {
		if (mXEKStructureDoc == 0)
			return null;
		
		if (mStructureDocWrapper == null)
			mStructureDocWrapper = new CEBXStructureDocWrapper(mXEKStructureDoc);
		
		return mStructureDocWrapper;
	}

	/**
	 * 获取目录对象。
	 * @return
	 */
	public CEBXOutlineWrapper GetOutline() {
		long handle = GetXEKOutline();
		
		if (handle !=  0)
			return new CEBXOutlineWrapper(handle);
		else
			return null;
	}
	
	/**
	 * 获取XEK目录对象。
	 * @return			XEK目录对象
	 */
	private native long GetXEKOutline();
	
	/**
	 * 获取页数。
	 * @return				页数。
	 */
	public native int GetPageCount();

	/**
	 * 获取指定页面区域。
	 * @param pagenum		页码，从1开始。
	 * @param pageBoxType	页面框类型。
	 * @param pageRect		页面框。
	 * @return				是否成功。
	 */
	public native boolean GetPageBox(long pagenum, int pageBoxType, CxRect pageRect);
	
	/**
	 * 绘制页面。
	 * @param infodev				绘制目标信息
	 * @param bitmap				绘制目标
	 * @param pagenum				目标页码，从1开始
	 * @param dpi					输出设备DPI
	 * @param rcPage				待输出的页面矩形（页面坐标系）
	 * @param xscale				X方向页面缩放比（>0）
	 * @param yscale				Y方向页面缩放比（>0）
	 * @param rotate				输出旋转角度（0~360）***注：沿输出设备坐标（0，0）点旋转（当前用户坐标系）
	 * @param smoothTag				平滑参数，见DK_SMOOTHTAG枚举
	 * @return						是否成功。
	 */
	public native boolean RenderPage(CxBitmapInfoDev infodev, int[] bitmap, int pagenum, int dpi, CxRect rcPage, double xscale, double yscale, double rotate, long smoothTag);
	
	/**
	 * 查找。
	 * @param pagenum				页码，从1开始
	 * @param option				查找参数
	 * @return						查找结果Array
	 */
	public ArrayList<CxSearchResult> FindTextInPage(int pagenum, CxSearchOption option) {
		switch (XEKFindTextInPage(pagenum, option))
		{
		case 1:
			nFindRetcode = XEK_FIND_SUCCESS;
			return arraySearchResults;
		case 2:
			nFindRetcode = XEK_FIND_NOMATCHWORD;
			break;
		case 3:
			nFindRetcode = XEK_FIND_USERSTOP;
			break;
		case 4:
			nFindRetcode = XEK_FIND_ERROR;
			break;
		default:
			nFindRetcode = XEK_FIND_ERROR;
			break;
		}
		return null;
	}
	
	public int GetLastFindRetcode() {
		return nFindRetcode;
	}
	
	private native int XEKFindTextInPage(int pagenum, CxSearchOption option);
	
	private void AddSearchResult(CxSearchResult result) {
		arraySearchResults.add(result);
	}

	/*
	 * clear the search result.
	 */
	public void ClearSearchResult() {
		arraySearchResults.clear();
	}
}
